package itheima04;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/*
    反射获取成员方法
    步骤:
        1.获取Class类型的对象(三种方式,建议使用第三种forName)
        2.java.lang.Class类 成员方法
            public Method[] getMethods(): 获取所有public修饰的成员方法,包含继承下来的
                每个成员方法被封装成了一个Method对象,存储Method数组中
                java.lang.reflect.Method类: 是用来描述成员方法的
            public Method getMethod(String name, Class... parameterTypes):
                获取public修饰的指定方法名称,指定参数类型对应的成员方法对象
                参数:
                    String name: 方法名称
                    Class... parameterTypes: 必须传递数据类型对应的Class对象,而且是可变参数,可以传递数组,参数列表,空参不传递

        3.练习:
            获取public修饰的名称为toString的没有参数的方法
            获取public修饰的名称为setName的参数为String类型的方法
            获取public修饰的名称为getSum的参数为两个int类型的方法
            获取public修饰的名称为my2CharArray的参数为String类型的方法



 */
/*public class Demo04GetMethod {
    public static void main(String[] args) throws Exception {
        //1.获取Class类型的对象(三种方式,建议使用第三种forName)
        Class<?> c = Class.forName("domain.Person");
        //2.获取所有public修饰的成员方法,包含继承下来的
        Method[] ms = c.getMethods();
        for (Method m : ms) {
            System.out.println(m);
        }
        System.out.println("--------------");

        //获取public修饰的名称为toString的没有参数的方法
        Method m1 = c.getMethod("toString");
        System.out.println(m1);

        //获取public修饰的名称为setName的参数为String类型的方法
        Method m2 = c.getMethod("setName", String.class);
        System.out.println(m2);

        // 获取public修饰的名称为getSum的参数为两个int类型的方法
        //getSum是private修饰的,无法获取,报出异常
        //Method m3 = c.getMethod("getSum", int.class, int.class);
        //System.out.println(m3);

        //获取public修饰的名称为my2CharArray的参数为String类型的方法
        Method m4 = c.getMethod("my2CharArray", String.class);
        System.out.println(m4);

    }
}*/


public class Demo04GetMethod {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //1.获取Class类型的对象(三种方式,建议使用第三种forName)
          Class<?> c=Class.forName("domain.Person");
        //2.获取所有public修饰的构造方法,包含继承下来的
        Constructor<?>[]constructor=c.getConstructors();
        for (Constructor<?> constructor1 : constructor) {
            System.out.println(constructor1);
        }
        System.out.println("---------------");
        //查询所有方法，只能是publci修饰的方法
        Method[] method = c.getMethods();
        for (Method method1 : method) {
            System.out.println(method1);
        }

        System.out.println("---------------");
        //获取public修饰的名称为toString的没有参数的方法
         Method m = c.getMethod("toString");
        System.out.println(m);

        //获取public修饰的名称为setName的参数为String类型的方法
         Method setName = c.getMethod("setName", String.class);
        System.out.println(setName);
        // 获取public修饰的名称为getSum的参数为两个int类型的方法
        //getSum是private修饰的,无法获取,报出异常
        //Method m3 = c.getMethod("getSum", int.class, int.class);
        //System.out.println(m3);

        //获取public修饰的名称为my2CharArray的参数为String类型的方法
         Method my2CharArray = c.getMethod("my2CharArray", String.class);
         System.out.println(my2CharArray);

    }
}